package std

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"strings"
)

/**
常用特性
结构体标签：使用 json:"fieldName" 标签控制字段名

忽略空字段：json:"fieldName,omitempty"

跳过字段：使用 - 作为字段名 json:"-"

原始消息：json.RawMessage 类型可以延迟解析部分 JSON

自定义编码/解码：通过实现 json.Marshaler 和 json.Unmarshaler 接口
*/

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func StdEncode() {
	p := Person{Name: "Alice", Age: 30}
	jsonData, err := json.Marshal(p)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(jsonData)) // 输出: {"name":"Alice","age":30}
}

func StdDecode() {
	jsonStr := `{"name":"Bob","age":25}`
	var p Person
	err := json.Unmarshal([]byte(jsonStr), &p)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", p) // 输出: {Name:Bob Age:25}
}

func StdStream() {
	// 编码到 io.Writer
	p := Person{Name: "Alice", Age: 30}
	enc := json.NewEncoder(os.Stdout)
	err := enc.Encode(p)
	fmt.Println(err)

	// 从 io.Reader 解码
	jsonStr := `{"name":"Bob","age":25}`
	//dec := json.NewDecoder(os.Stdin)
	dec := json.NewDecoder(strings.NewReader(jsonStr))
	var p2 Person
	err = dec.Decode(&p2)
}
